package com.lqz.tools;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExportUtil {

	public void write_Excel(String xls_write_Address, ArrayList<ArrayList> ls, String[] sheetnames) throws IOException {

		FileOutputStream output = new FileOutputStream(new File(xls_write_Address)); // 读取的文件路径
		XSSFWorkbook wb = new XSSFWorkbook();// (new
		// BufferedInputStream(output));

		for (int sn = 0; sn < ls.size(); sn++) {
			XSSFSheet sheet = wb.createSheet(String.valueOf(sn));
			wb.setSheetName(sn, sheetnames[sn]);
			ArrayList<String[]> ls2 = ls.get(sn);
			for (int i = 0; i < ls2.size(); i++) {
				XSSFRow row = sheet.createRow(i);
				String[] s = ls2.get(i);
				for (int cols = 0; cols < s.length; cols++) {
					XSSFCell cell = row.createCell(cols);
					cell.setCellType(XSSFCell.CELL_TYPE_STRING);// 文本格式
					cell.setCellValue(s[cols]);// 写入内容
				}

			}
		}
		wb.write(output);
		output.close();
		System.out.println("-------【完成写入】-------");
	}

	public static void createFile() throws IOException {
		// 创建HSSFWorkbook对象
		HSSFWorkbook wb = new HSSFWorkbook();
		// 创建HSSFSheet对象
		HSSFSheet sheet = wb.createSheet("sheet0");
		// 创建HSSFRow对象
		HSSFRow row = sheet.createRow(0);
		// 创建HSSFCell对象
		HSSFCell cell = row.createCell(0);
		// 设置单元格的值
		cell.setCellValue("单元格中的中文");
		// 输出Excel文件
		FileOutputStream output = new FileOutputStream("d:\\workbook.xls");
		wb.write(output);
		output.flush();
	}

	public void read_Excel(String xls_read_Address) throws ClassNotFoundException, SQLException {
		try {
			// DataConvert dc = new DataConvert();//数据转换工具
			DecimalFormat df = (DecimalFormat) NumberFormat.getPercentInstance();
			ArrayList<ArrayList> ls = new ArrayList<ArrayList>();

			FileInputStream input = new FileInputStream(new File(xls_read_Address)); // 读取的文件路径
			XSSFWorkbook wb = new XSSFWorkbook(new BufferedInputStream(input));

			int sheet_numbers = wb.getNumberOfSheets();// 获取表的总数
			String[] sheetnames = new String[sheet_numbers];

			Connection con = null;
			Statement stmt = null;
			ResultSet rs = null;
			String s_3g = null;
			Class.forName("oracle.jdbc.driver.OracleDriver");
			con = DriverManager.getConnection("jdbc:oracle:thin:@10.35.77.254:1522:jlfuel", "jlfuel", "jlfuel");
			stmt = con.createStatement();

			for (int i = 0; i < sheet_numbers; i++) {// 遍历所有表
				ArrayList<String[]> ls_a = new ArrayList<String[]>(); // 用来存储某个表
				// 读取出来的数据
				XSSFSheet sheet = wb.getSheetAt(i); // 获取 某个表
				sheetnames[i] = sheet.getSheetName();// 获取表名，存入数组
				System.out.println("------>>>---正在读取Excel表数据，当前表：" + sheetnames[i]);

				for (int rows = 0; rows < sheet.getLastRowNum(); rows++) {// 有多少行
					XSSFRow row = sheet.getRow(rows);// 取得某一行 对象
					String[] s = new String[5];// 初始化数组长度

					for (int columns = 0; columns < row.getLastCellNum(); columns++) {// 读取所有列
						// s[columns] =
						// row.getCell(columns).getStringCellValue();
						// //取得某单元格内容，字符串类型
						XSSFCell cell = row.getCell(columns);
						if (cell != null) {
							switch (cell.getCellType()) {
							case XSSFCell.CELL_TYPE_STRING: // 字符串
								s[columns] = cell.getStringCellValue();
								if (s[columns] == null) {
									s[columns] = " ";
								}
								break;
							case XSSFCell.CELL_TYPE_NUMERIC: // 数字
								double strCell = cell.getNumericCellValue();
								if (String.valueOf(strCell) == null) {
									s[columns] = " ";
								}

								df.applyPattern("0");
								s[columns] = df.format(strCell);
								if (Double.parseDouble(s[columns]) != strCell) {
									df.applyPattern(Double.toString(strCell));
									s[columns] = df.format(strCell);
								}

								break;
							case XSSFCell.CELL_TYPE_BLANK: // 空值
								s[columns] = " ";
								break;
							default:
								System.out.print("\n---单元格格式不支持---");
								break;
							}
						}
					}

					/* ******** 访问数据库 ，并判断是否3G ******** */
					String sql = "select * from ap_t_si_cus_spec_info where cus_phone='" + s[1] + "' and rownum=1";
					rs = stmt.executeQuery(sql);

					if (rs.next()) {
						if (rs.getString("busiattr1") != null) {
							s_3g = rs.getString("busiattr1").toString().toUpperCase();
						} else {
							s_3g = " ";
						}
					} else {
						s_3g = " ";
					}
					/* ******** 访问结束 ******** */

					if (s_3g.contains("3G")) {
						s[4] = "是";// 写入 “是否3G”这一列 的值，比如 “是”
					}
					if (s[4] == null) {
						s[4] = " ";
					}
					System.out.println("\n------>>>---已处理数据---号码：" + s[1] + "\t\t是否3G：" + s[4]);
					ls_a.add(s);// 添加每行数据到 ls_a
				}
				ls.add(ls_a); // 添加 每个表 到 ls
				System.out.println("\n------>>>---开始写入Excel文件，请耐心等待---<<<------");
				input.close();
				String xls_write_Address = null;
				write_Excel(xls_write_Address, ls, sheetnames);
			}
		} catch (IOException ex) {
			ex.printStackTrace();
		}
	}

	public static <T> void writeExcel(String sheetTitle, String[] titles)
			// (Class<T> clazz, List<T> dataModels,
			// String[] fieldNames, String[] titles)
			throws Exception {
		XSSFWorkbook workbook = null;
		// 检测文件是否存在，如果存在则修改文件，否则创建文件
		File file = new File("d:/3.xlsx");
		if (file.exists()) {
			file.delete();
		}
		workbook = new XSSFWorkbook();

		// 根据当前工作表数量创建相应编号的工作表
		String sheetName = DateUtil.format("yyyy年MM月dd日HH小时mm分钟ss秒");
		XSSFSheet sheet = workbook.createSheet(sheetName);

		XSSFRow titleRow = sheet.createRow(0);
		titleRow.setHeightInPoints((short) 30);
		XSSFCell cell1 = titleRow.createCell(0);
		cell1.setCellValue(sheetTitle);
		sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 6));
		// =======创建单元格样式:开始===========
		CellStyle titleStyle = workbook.createCellStyle();
		titleStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
		titleStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
		titleStyle.setWrapText(true);
		XSSFFont font = workbook.createFont();
		font.setBoldweight(Font.BOLDWEIGHT_BOLD);
		titleStyle.setFont(font);
		// =======创建单元格样式:结束===========
		cell1.setCellStyle(titleStyle);
		XSSFRow Row2 = sheet.createRow(1);
		XSSFCell row2cell1=Row2.createCell(3);
		row2cell1.setCellValue("查询生产开始时间：");
		XSSFCell row2cell2=Row2.createCell(4);
		row2cell2.setCellValue(new Date());
		
		XSSFRow headRow = sheet.createRow(2);
		// 添加表格标题
		for (int i = 0; i < titles.length; i++) {
			XSSFCell cell = headRow.createCell(i);
			cell.setCellValue(titles[i]);
			cell.setCellStyle(titleStyle);
			// 设置单元格宽度
			sheet.setColumnWidth(i, titles[i].length() * 600);
		}
		// 添加表格内容
		// for (int i = 0; i < dataModels.size(); i++) {
		// T target = dataModels.get(i);
		// XSSFRow row = sheet.createRow(i + 1);
		// // 遍历属性列表
		// for (int j = 0; j < fieldNames.length; j++) {
		// // 通过反射获取属性的值域
		// String fieldName = fieldNames[j];
		// if (fieldName == null || UID.equals(fieldName)) {
		// continue; // 过滤serialVersionUID属性
		// }
		// Object result = ReflectUtil.invokeGetter(target, fieldName);
		// XSSFCell cell = row.createCell(j);
		// cell.setCellValue(StringUtil.toString(result));
		// // 如果是日期类型则进行格式化处理
		// if (isDateType(clazz, fieldName)) {
		// cell.setCellValue(DateUtil.format((Date) result));
		// }
		// }
		// }
		// 将数据写到磁盘上
		FileOutputStream fos = new FileOutputStream(file);
		try {
			workbook.write(new FileOutputStream(file));
		} finally {
			if (fos != null) {
				fos.close(); // 不管是否有异常发生都关闭文件输出流
			}
		}
	}

	public static void main(String[] args) throws Exception {
		// createFile();
		String[] titles = { "封装组件SAP号", "封装组件序列号", "工艺过程序号", "工艺过程Cycle Time(s)", "此工艺过程完成生产日期时间", "生产线编号", "位置1衬垫序列号",
				"位置1衬垫批次号", "位置1衬垫称重设备编号", "位置1衬垫重量", "位置1衬垫是否合格", "位置2衬垫序列号", "位置2衬垫批次号", "位置2衬垫称重设备编号", "位置2衬垫重量",
				"位置2衬垫是否合格", "位置3衬垫序列号", "位置3衬垫批次号", "位置3衬垫称重设备编号", "位置3衬垫重量", "位置3衬垫是否合格", "位置1载体#1 2DMC追溯号",
				"位置1载体#1已重复使用次数", "位置1载体#1测量测量设备编号", "位置1载体#1测量配方号与版本", "位置1载体#1测量平面序号", "位置1载体#1最小直径（每个平面）",
				"位置1载体#1最大直径（每个平面）", "位置1载体#1周长（每个平面）", "位置1载体#1周长（所有平面）", "位置1载体#1面积（每个平面）", "位置1载体#1面积（所有平面）",
				"位置1载体#1平均直径（每个平面）", "位置1载体#1平均直径（所有平面）", "位置1载体#1载体高度", "位置1载体#1是否合格", "位置1载体#1测量环境温度",
				"位置1载体#2 2DMC追溯号", "位置1载体#2已重复使用次数", "位置1载体#2测量测量设备编号", "位置1载体#2测量配方号与版本", "位置1载体#2测量平面序号",
				"位置1载体#2最小直径（每个平面）", "位置1载体#2最大直径（每个平面）", "位置1载体#2周长（每个平面）", "位置1载体#2周长（所有平面）", "位置1载体#2面积（每个平面）",
				"位置1载体#2面积（所有平面）", "位置1载体#2平均直径（每个平面）", "位置1载体#2平均直径（所有平面）", "位置1载体#2载体高度", "位置1载体#2是否合格",
				"位置1载体#2测量环境温度", "位置2载体#1 2DMC追溯号", "位置2载体#1已重复使用次数", "位置2载体#1测量测量设备编号", "位置2载体#1测量配方号与版本",
				"位置2载体#1测量平面序号", "位置2载体#1最小直径（每个平面）", "位置2载体#1最大直径（每个平面）", "位置2载体#1周长（每个平面）", "位置2载体#1周长（所有平面）",
				"位置2载体#1面积（每个平面）", "位置2载体#1面积（所有平面）", "位置2载体#1平均直径（每个平面）", "位置2载体#1平均直径（所有平面）", "位置2载体#1载体高度",
				"位置2载体#1是否合格", "位置2载体#1测量环境温度", "位置2载体#2 2DMC追溯号", "位置2载体#2已重复使用次数", "位置2载体#2测量测量设备编号",
				"位置2载体#2测量配方号与版本", "位置2载体#2测量平面序号", "位置2载体#2最小直径（每个平面）", "位置2载体#2最大直径（每个平面）", "位置2载体#2周长（每个平面）",
				"位置2载体#2周长（所有平面）", "位置2载体#2面积（每个平面）", "位置2载体#2面积（所有平面）", "位置2载体#2平均直径（每个平面）", "位置2载体#2平均直径（所有平面）",
				"位置2载体#2载体高度", "位置2载体#2是否合格", "位置2载体#2测量环境温度", "位置3载体#1 2DMC追溯号", "位置3载体#1已重复使用次数", "位置3载体#1测量测量设备编号",
				"位置3载体#1测量配方号与版本", "位置3载体#1测量平面序号", "位置3载体#1最小直径（每个平面）", "位置3载体#1最大直径（每个平面）", "位置3载体#1周长（每个平面）",
				"位置3载体#1周长（所有平面）", "位置3载体#1面积（每个平面）", "位置3载体#1面积（所有平面）", "位置3载体#1平均直径（每个平面）", "位置3载体#1平均直径（所有平面）",
				"位置3载体#1载体高度", "位置3载体#1是否合格", "位置3载体#1测量环境温度", "位置3载体#2 2DMC追溯号", "位置3载体#2已重复使用次数", "位置3载体#2测量测量设备编号",
				"位置3载体#2测量配方号与版本", "位置3载体#2测量平面序号", "位置3载体#2最小直径（每个平面）", "位置3载体#2最大直径（每个平面）", "位置3载体#2周长（每个平面）",
				"位置3载体#2周长（所有平面）", "位置3载体#2面积（每个平面）", "位置3载体#2面积（所有平面）", "位置3载体#2平均直径（每个平面）", "位置3载体#2平均直径（所有平面）",
				"位置3载体#2载体高度", "位置3载体#2是否合格", "位置3载体#2测量环境温度", "位置1包裹组件塞入顺序", "位置1包裹组件塞入设备编号与塞入端", "位置1包裹组件塞入时间",
				"位置1包裹组件塞入位置", "位置1包裹组件塞入过程峰值力", "位置1包裹组件塞入过程峰值力产生位置", "位置2包裹组件塞入顺序", "位置2包裹组件塞入设备编号与塞入端",
				"位置2包裹组件塞入时间", "位置2包裹组件塞入位置", "位置2包裹组件塞入过程峰值力", "位置2包裹组件塞入过程峰值力产生位置", "位置3包裹组件塞入顺序",
				"位置3包裹组件塞入设备编号与塞入端", "位置3包裹组件塞入时间", "位置3包裹组件塞入位置", "位置3包裹组件塞入过程峰值力", "位置3包裹组件塞入过程峰值力产生位置",
				"位置1载体1#整形顺序", "位置1载体1#整形设备编号", "位置1载体#1整形配方号与版本", "位置1载体1#整形时间", "位置1载体1#整形目标值计算方式", "位置1载体1#整形目标值",
				"位置1载体1#整形补偿后目标值", "位置1载体1#整形机实际加工值", "位置1载体2#整形顺序", "位置1载体2#整形设备编号", "位置1载体#2整形配方号与版本", "位置1载体2#整形时间",
				"位置1载体2#整形目标值计算方式", "位置1载体2#整形目标值", "位置1载体2#整形补偿后目标值", "位置1载体2#整形机实际加工值", "位置2载体1#整形顺序",
				"位置2载体1#整形设备编号", "位置2载体#1整形配方号与版本", "位置2载体1#整形时间", "位置2载体1#整形目标值计算方式", "位置2载体1#整形目标值",
				"位置2载体1#整形补偿后目标值", "位置2载体1#整形机实际加工值", "位置2载体2#整形顺序", "位置2载体2#整形设备编号", "位置2载体#2整形配方号与版本", "位置2载体2#整形时间",
				"位置2载体2#整形目标值计算方式", "位置2载体2#整形目标值", "位置2载体2#整形补偿后目标值", "位置2载体2#整形机实际加工值", "位置3载体1#整形顺序",
				"位置3载体1#整形设备编号", "位置3载体#1整形配方号与版本", "位置3载体1#整形时间", "位置3载体1#整形目标值计算方式", "位置3载体1#整形目标值",
				"位置3载体1#整形补偿后目标值", "位置3载体1#整形机实际加工值", "位置3载体2#整形顺序", "位置3载体2#整形设备编号", "位置3载体#2整形配方号与版本", "位置3载体2#整形时间",
				"位置3载体2#整形目标值计算方式", "位置3载体2#整形目标值", "位置3载体2#整形补偿后目标值", "位置3载体2#整形机实际加工值", "进气端口整形顺序", "进气端口整形设备编号",
				"进气端口整形配方号与版本", "进气端口整形时间", "进气端口整形目标值计算方式", "进气端口整形目标值", "进气端口整形补偿后目标值", "进气端口整形机实际加工值", "出气端口整形顺序",
				"出气端口整形设备编号", "出气端口整形配方号与版本", "出气端口整形时间", "出气端口整形目标值计算方式", "出气端口整形目标值", "出气端口整形补偿后目标值", "出气端口整形机实际加工值",
				"组件重复测量次数", "组件测量设备编号", "组件测量配方号与版本", "组件位置1载体#1测量平面序号", "组件位置1载体#1最小直径（每个平面）", "组件位置1载体#1最大直径（每个平面）",
				"组件位置1载体#1周长（每个平面）", "组件位置1载体#1周长（所有平面）", "组件位置1载体#1面积（每个平面）", "组件位置1载体#1面积（所有平面）",
				"组件位置1载体#1平均直径（每个平面）", "组件位置1载体#1平均直径（所有平面）", "组件位置1载体#1特殊特性值计算方式", "组件位置1载体#1特殊特性值（每个平面）",
				"组件位置1载体#1特殊特性值（所有平面）", "组件位置1载体#1整形区域是否合格", "组件位置1载体#2测量平面序号", "组件位置1载体#2最小直径（每个平面）",
				"组件位置1载体#2最大直径（每个平面）", "组件位置1载体#2周长（每个平面）", "组件位置1载体#2周长（所有平面）", "组件位置1载体#2面积（每个平面）",
				"组件位置1载体#2面积（所有平面）", "组件位置1载体#2平均直径（每个平面）", "组件位置1载体#2平均直径（所有平面）", "组件位置1载体#2特殊特性值计算方式",
				"组件位置1载体#2特殊特性值（每个平面）", "组件位置1载体#2特殊特性值（所有平面）", "组件位置1载体#2整形区域是否合格", "组件位置2载体#1测量平面序号",
				"组件位置2载体#1最小直径（每个平面）", "组件位置2载体#1最大直径（每个平面）", "组件位置2载体#1周长（每个平面）", "组件位置2载体#1周长（所有平面）",
				"组件位置2载体#1面积（每个平面）", "组件位置2载体#1面积（所有平面）", "组件位置2载体#1平均直径（每个平面）", "组件位置2载体#1平均直径（所有平面）",
				"组件位置2载体#1特殊特性值计算方式", "组件位置2载体#1特殊特性值（每个平面）", "组件位置2载体#1特殊特性值（所有平面）", "组件位置2载体#1整形区域是否合格",
				"组件位置2载体#2测量平面序号", "组件位置2载体#2最小直径（每个平面）", "组件位置2载体#2最大直径（每个平面）", "组件位置2载体#2周长（每个平面）",
				"组件位置2载体#2周长（所有平面）", "组件位置2载体#2面积（每个平面）", "组件位置2载体#2面积（所有平面）", "组件位置2载体#2平均直径（每个平面）",
				"组件位置2载体#2平均直径（所有平面）", "组件位置2载体#2特殊特性值计算方式", "组件位置2载体#2特殊特性值（每个平面）", "组件位置2载体#2特殊特性值（所有平面）",
				"组件位置2载体#2整形区域是否合格", "组件位置3载体#1测量平面序号", "组件位置3载体#1最小直径（每个平面）", "组件位置3载体#1最大直径（每个平面）",
				"组件位置3载体#1周长（每个平面）", "组件位置3载体#1周长（所有平面）", "组件位置3载体#1面积（每个平面）", "组件位置3载体#1面积（所有平面）",
				"组件位置3载体#1平均直径（每个平面）", "组件位置3载体#1平均直径（所有平面）", "组件位置3载体#1特殊特性值计算方式", "组件位置3载体#1特殊特性值（每个平面）",
				"组件位置3载体#1特殊特性值（所有平面）", "组件位置3载体#1整形区域是否合格", "组件位置3载体#2测量平面序号", "组件位置3载体#2最小直径（每个平面）",
				"组件位置3载体#2最大直径（每个平面）", "组件位置3载体#2周长（每个平面）", "组件位置3载体#2周长（所有平面）", "组件位置3载体#2面积（每个平面）",
				"组件位置3载体#2面积（所有平面）", "组件位置3载体#2平均直径（每个平面）", "组件位置3载体#2平均直径（所有平面）", "组件位置3载体#2特殊特性值计算方式",
				"组件位置3载体#2特殊特性值（每个平面）", "组件位置3载体#2特殊特性值（所有平面）", "组件位置3载体#2整形区域是否合格", "组件进气端口平均直径", "组件进气端口最小直径",
				"组件进气端口最大直径", "组件进气端口是否合格", "组件出气端口平均直径", "组件出气端口最小直径", "组件出气端口最大直径", "组件出气端口是否合格", "组件高度", "组件是否合格",
				"组件测量环境温度", "工艺过程序号", "标刻内容配方号与版本", "标刻客户2DMC内容", "扫描客户2DMC内容", "扫描客户2DMC等级" };
		writeExcel("这是主标题", titles);
		System.out.println("-------【完成写入】-------");
	}
}
